package com.qire.manhua.dal.dao;

import com.qire.common.dal.dao.BaseDatabase;
import com.qire.common.dal.dao.DatabaseFactory;
import com.qire.manhua.dal.converter.DateConverter;
import com.qire.manhua.model.po.ComicDownloadRecord;
import com.qire.manhua.model.po.LocalComicChapter;
import com.qire.manhua.model.po.ComicReadHistoryRecord;
import com.qire.manhua.model.po.SearchHistoryRecord;

import androidx.room.Database;
import androidx.room.TypeConverters;

/**
 * 漫画数据库，这个类就代表一个数据库，room框架会根据注解描述自动生成一个实现类，我们需要在注解中指定好数据库中有哪些表，以及数据库一些相关描述配置，如：
 * 版本号等相关信息，此外还需要在类中指派操作数据库中各个标的Dao层接口，如果不在此指派，APT则不会遍历检索并生成对应Dao接口的实体类型。一般情况下，一个表需要有一个Dao操作。
 * {@link Database} 数据库基本信息描述注解 <br />
 * {@link Database#entities()} 数据库表描述
 * {@link Database#version()} 数据库版本，如果版本存在差异，则需要在库中扩展差异配置，比如 2 版本比 1版本 新增了字段，则需要SQL语句更新。
 */
@Database(entities = {
        SearchHistoryRecord.class,
        ComicReadHistoryRecord.class,
        ComicDownloadRecord.class,
        LocalComicChapter.class}, version = 1, exportSchema = false)
@TypeConverters({DateConverter.class})
public abstract class ComicDatabase extends BaseDatabase {

    /**
     * 获得一个数据库实例
     * @return 返回一个数据库实例，该数据库是单例的。
     */
    public static final ComicDatabase database() {
        return DatabaseFactory.create(ComicDatabase.class);
    }

    /**
     * 漫画搜索历史记录表
     * @return
     */
    public abstract SearchHistoryDao searchHistoryDao();
    /**
     * 漫画阅读历史记录表
     * @return
     */
    public abstract ComicReadHistoryDao comicReadHistoryDao();

    /**
     * 漫画下载记录表
     * @return
     */
    public abstract ComicDownloadDao comicDownloadDao();

    /**
     * 漫画章节数据表Dao
     * @return
     */
    public abstract ComicChapterDao comicChapterDao();

}
